package org.pictual.action;

import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.pictual.business.dao.AccesoBD;
import org.pictual.business.vo.CompletoVO;
import org.pictual.business.vo.DefinicionVO;
import org.pictual.business.vo.IdiomaVO;
import org.pictual.business.vo.ImagenVO;
import org.pictual.business.vo.PalabraVO;
import org.pictual.controller.DatabaseImg;
import org.pictual.controller.GoogleSearchImg;
import org.pictual.controller.MyImage;
import org.pictual.controller.WikiObtieneDatos;
import org.pictual.controller.WikiTrataDatos;
import org.pictual.controller.mainPackage.Language;
import org.pictual.service.PictualDelegateFactory;
import org.pictual.util.RequestKeys;
import org.pictual.util.SessionKeys;
import org.pictual.web.form.CompletoForm;

public class DatosAction extends DispatchAction{
	
	public ActionForward wiki(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		HttpSession session = request.getSession();
		
		String query = request.getParameter(RequestKeys.QUERY);
		String from = request.getParameter(RequestKeys.FROM);
		String to = request.getParameter(RequestKeys.TO);
		String source = request.getParameter(RequestKeys.SOURCE);
		String cadena = WikiObtieneDatos.getData(request.getParameter(RequestKeys.QUERY), request.getParameter(RequestKeys.TO));
		
		if(cadena.isEmpty()){
			request.setAttribute(RequestKeys.COLOR, "#FFFFFF");
			request.setAttribute(RequestKeys.ERROR, "La palabra "+query+"("+from+") no esta en la wiki "+ to);
			request.setAttribute(RequestKeys.QUERY, query);
			request.setAttribute(RequestKeys.FROM, from);
			request.setAttribute(RequestKeys.TO, to);
			return mapping.findForward("success");
		}
		WikiTrataDatos wtd = new WikiTrataDatos(query, cadena, to, from);
		IdiomaVO idioma = wtd.getIdiomaVO();
		DefinicionVO definicion = wtd.getDefinicionVO();
		PalabraVO palabra = wtd.getPalabraVO();
		
		CompletoVO completo = new CompletoVO();
		completo.setAudio(idioma.getAudio());
    	completo.setCod_audio(idioma.getCod_audio());
    	completo.setConjugacion(idioma.getConjugacion_verbo());
    	completo.setD1(definicion.getDefinicion_1());
    	completo.setD2(definicion.getDefinicion_2());
    	completo.setD3(definicion.getDefinicion_3());
    	completo.setDe(idioma.getEquivalente_de());
    	completo.setE1(definicion.getEjemplo_1());
    	completo.setE2(definicion.getEjemplo_2());
    	completo.setE3(definicion.getEjemplo_3());
    	completo.setEn(idioma.getEquivalente_en());
    	completo.setEs(idioma.getEquivalente_es());
    	completo.setFr(idioma.getEquivalente_fr());
    	completo.setGenero(idioma.getGenero());
    	completo.setId(new Integer(palabra.getPalabra_id()));
    	completo.setIdioma(new Integer(definicion.getIdioma_origen()));
    	completo.setInfo(definicion.getInfo_direccion());
    	completo.setOtro(String.valueOf(idioma.isOtro()));
    	completo.setPalabra(idioma.getNombre());
    	completo.setPlural(idioma.getPlural());
    	completo.setPronunciacion(idioma.getPronunciacion());
    	System.out.println("*****PRONUNCIACIÓN: "+idioma.getPronunciacion());
    	System.out.println("*****PRONUNCIACIÓN: "+completo.getPronunciacion());
    	completo.setSustantivo(String.valueOf(idioma.isSustantivo()));
    	completo.setVerbo(idioma.getVerbo());
    	completo.setWiki(new Integer(definicion.getIdioma_destino()));
		
		CompletoForm completoForm = (CompletoForm) form;
		
		completoForm.set(completo);
		completoForm.setCadena(cadena);

		request.setAttribute(RequestKeys.SOURCE, source);
		request.setAttribute(RequestKeys.QUERY, query);
		request.setAttribute(RequestKeys.FROM, from);
		request.setAttribute(RequestKeys.TO, to);
		request.setAttribute(RequestKeys.COLOR, "#FFF1D6");
		
		session.setAttribute(SessionKeys.IDIOMA, idioma);
		session.setAttribute(SessionKeys.DEFINICION, definicion);
		session.setAttribute(SessionKeys.PALABRA, palabra);
		
		request.setAttribute(RequestKeys.WIKI, true);
		
		return mapping.findForward("success");
	}
	
	public ActionForward database(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		String query = request.getParameter(RequestKeys.QUERY);
		String from = request.getParameter(RequestKeys.FROM);
		String to = request.getParameter(RequestKeys.TO);
		String source = request.getParameter(RequestKeys.SOURCE);
		
		int wiki=0; int idioma=0;
		
		if(from.equals("en")) idioma=1;
		if(from.equals("es")) idioma=2;
		if(from.equals("de")) idioma=3;
		if(from.equals("fr")) idioma=4;
		
		if(to.equals("en")) wiki=1;
		if(to.equals("es")) wiki=2;
		if(to.equals("de")) wiki=3;
		if(to.equals("fr")) wiki=4;
		

		AccesoBD accesoBD = new AccesoBD();
		Vector<MyImage> images = new Vector<MyImage>();
		ImagenVO[] imagenes = new ImagenVO[6];
		PalabraVO palabraVO;
		
		if(accesoBD.conecta()){
			CompletoVO completo = PictualDelegateFactory.getIdiomaDelegate().selectPalabraCompleta(query, idioma, wiki);
			
			if(completo==null){
				request.setAttribute(RequestKeys.COLOR, "#FFFFFF");
				request.setAttribute(RequestKeys.QUERY, query);
				request.setAttribute(RequestKeys.FROM, from);
				request.setAttribute(RequestKeys.TO, to);
				request.setAttribute(RequestKeys.ERROR, "La palabra "+query+"("+from+") en idioma "+to+" no esta en la base de datos");
				return mapping.findForward("success");
			}
			CompletoForm completoForm = (CompletoForm) form;
			
			completoForm.set(completo);
			
			
			log.info("data: Se leen las imagenes de: "+completo.getId());
			palabraVO = PictualDelegateFactory.getPalabraDelegate().readPalabra(completo.getId());
			imagenes[0] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_1());
			imagenes[1] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_2());
			imagenes[2] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_3());
			imagenes[3] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_4());
			imagenes[4] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_5());
			imagenes[5] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_6());
				
			completo.setImagenes(imagenes);
			
			
			if((completo.getImagenes()!=null)||(completo.getImagenes().length>1)){
				images = DatabaseImg.getVectorImages(imagenes);

				log.info("data: Se guardan las imagenes: "+images.size());
			}
			
		}else {
			request.setAttribute(RequestKeys.ERROR, "No funciona la base de datos");

		}
		
		request.setAttribute(RequestKeys.IMAGES, images);
		request.setAttribute(RequestKeys.IMAGEN1, images.get(0).getImgThumbnail());
		request.setAttribute(RequestKeys.SOURCE, source);
		request.setAttribute(RequestKeys.QUERY, query);
		request.setAttribute(RequestKeys.FROM, from);
		request.setAttribute(RequestKeys.TO, to);
		request.setAttribute(RequestKeys.COLOR, "#D6FFD6");
		
		request.setAttribute(RequestKeys.DATABASE, true);
		return mapping.findForward("success");
	}
	
	public ActionForward add(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		HttpSession session = request.getSession();
		
		String source = request.getParameter(RequestKeys.SOURCE);
		
		
		IdiomaVO idiomaVO = (IdiomaVO) session.getAttribute(SessionKeys.IDIOMA);
		DefinicionVO definicionVO = (DefinicionVO) session.getAttribute(SessionKeys.DEFINICION);
		PalabraVO palabraVO = (PalabraVO) session.getAttribute(SessionKeys.PALABRA);
		
		CompletoVO completo;
		log.info(palabraVO);
		log.info(definicionVO);
		log.info(idiomaVO);
		
		completo = new CompletoVO();
		completo.setIdiomaVO(idiomaVO);
		completo.setDefinicionVO(definicionVO);
		completo.setPalabraVO(palabraVO);
		
		String query = completo.getPalabra();
		String from = Language.resolve(completo.getWiki());
		String to = Language.resolve(completo.getIdioma());
		
		Vector<MyImage> images = new Vector<MyImage>();
		
		ImagenVO[] imagenes = new ImagenVO[6];
		
		AccesoBD accesoBD = new AccesoBD();
		
		if(accesoBD.conecta()){
			//SE DESCARGAN IMAGENES
			log.info("Se descargaran las imagenes");
			images = GoogleSearchImg.queryForImages(query, to);
			int i=0;
			for(MyImage img: images){
				log.info("imagen encontrada");
				imagenes[i]=new ImagenVO();
				imagenes[i].setHeight(img.getHeight());
				imagenes[i].setWidth(img.getWidth());
				imagenes[i].setPath_big(img.getImgLink());
				imagenes[i].setPath_small(img.getImgThumbnail());
				log.info(i+": "+imagenes[i].getPath_big());
				i++;
			}
			
			
			/* INSERTO EN BASE DE DATOS */
			log.info("INSERTO EN BASE DE DATOS");
			for(ImagenVO img: imagenes){
				if(img!=null) PictualDelegateFactory.getImagenDelegate().insertImagen(img);
			}
			if(imagenes[0]!=null) palabraVO.setImagen_1(imagenes[0].getImagen_id());
			if(imagenes[1]!=null) palabraVO.setImagen_2(imagenes[1].getImagen_id());
			if(imagenes[2]!=null) palabraVO.setImagen_3(imagenes[2].getImagen_id());
			if(imagenes[3]!=null) palabraVO.setImagen_4(imagenes[3].getImagen_id());
			if(imagenes[4]!=null) palabraVO.setImagen_5(imagenes[4].getImagen_id());
			if(imagenes[5]!=null) palabraVO.setImagen_6(imagenes[5].getImagen_id());
			
	
			completo.setImagenes(imagenes);
			
			int palabra_id=PictualDelegateFactory.getPalabraDelegate().insertPalabra(palabraVO);
			definicionVO.setPalabra_id(palabra_id);
			idiomaVO.setPalabra_id(palabra_id);
			
			if(PictualDelegateFactory.getIdiomaDelegate().readIdioma(idiomaVO.getNombre(), idiomaVO.getIdioma())==null)
				PictualDelegateFactory.getIdiomaDelegate().insertIdioma(idiomaVO);
			if(PictualDelegateFactory.getDefinicionDelegate().readDefinicion(definicionVO.getPalabra_id(), definicionVO.getIdioma_origen(), definicionVO.getIdioma_destino())==null)
				PictualDelegateFactory.getDefinicionDelegate().insertDefinicion(definicionVO);
			
		
		}else{
			request.setAttribute(RequestKeys.ERROR, "Hay un problema con la base de datos.");
		}
		request.setAttribute(RequestKeys.SOURCE, source);
		request.setAttribute(RequestKeys.QUERY, query);
		request.setAttribute(RequestKeys.FROM, from);
		request.setAttribute(RequestKeys.TO, to);
		request.setAttribute(RequestKeys.COLOR, "#D6FFD6");
		request.setAttribute(RequestKeys.DATABASE, true);
		
		return mapping.findForward("success");
	}
	
}
